﻿using MengLin.OOP.DesignPattern.Visitor.StudentGetVdieo.Interface;
using MengLin.OOP.DesignPattern.Visitor.StudentGetVdieo.Visitor;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MengLin.OOP.DesignPattern.Visitor.StudentGetVdieo
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 传统写法
            //{
            //    List<Student> students = new List<Student>()//初始化器
            //    {
            //        new StudentVip()
            //        {
            //            Id = 1,
            //            Name = "张三"
            //        },
            //        new StudentFree()
            //        {
            //            Id = 2,
            //            Name = "李四"
            //        },
            //    };
            //    foreach (var student in students)
            //    {
            //        student.Study();
            //        //这种做法不好，获取视频的行为属于学生的行为，不应该放在上端，应该封装在Student的子类里
            //        if (student is StudentVip)
            //        {
            //            Console.WriteLine("免费获取全套的公开课视频代码合集。");
            //        }
            //        else if(student is StudentFree)
            //        {
            //            Console.WriteLine("只能获取当次课的公开课视频代码合集。");
            //        }
            //    }
            //}
            #endregion

            #region 面向对象封装写法，获取视频的行为属于学生不同的行为，应该封装在Student子类里面
            //{
            //    List<Student> students = new List<Student>()//初始化器
            //    {
            //        new StudentVip()
            //        {
            //            Id = 1,
            //            Name = "张三"
            //        },
            //        new StudentFree()
            //        {
            //            Id = 2,
            //            Name = "李四"
            //        },
            //    };
            //    foreach (var student in students)
            //    {
            //        student.Study();
            //        student.GetVideo();
            //    }
            //}
            #endregion

            #region 访问者写法(和上面效果1样)
            {
                List<Student> students = new List<Student>()//初始化器
                {
                    new StudentVip()
                    {
                        Id = 1,
                        Name = "张三"
                    },
                    new StudentFree()
                    {
                        Id = 2,
                        Name = "李四"
                    },
                };
                IVisitor iVistor = new VistorCurrent();
                //IVisitor vistor = new VistorPast();//换个版本(好处：学生没有发生变化，就换了1个不同的获取政策)
                //IVisitor vistor = new VistorNew();//换个版本(好处：学生没有发生变化，就换了1个不同的获取政策)
                foreach (var student in students)
                {
                    student.Study();
                    //把获取视频这个逻辑转移，交给了Vistor去做(双重分派)
                    //因为逻辑复杂到1定程度了
                    student.GetVideoVistor(iVistor);
                }
            }
            #endregion

            Console.ReadKey();
        }
    }
}
